import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:psi/pages/home/home_binding.dart';
import 'package:psi/pages/home/home_view.dart';
import 'package:psi/pages/home/me/change_password/change_password_binding.dart';
import 'package:psi/pages/home/me/change_password/change_password_view.dart';
import 'package:psi/pages/home/purchase/purchase_add/purchase_add_binding.dart';
import 'package:psi/pages/home/sales/sales_add/sales_add_binding.dart';
import 'package:psi/pages/home/sales/sales_add/sales_add_view.dart';
import 'package:psi/pages/login/login_binding.dart';
import 'package:psi/pages/login/login_view.dart';
import 'package:psi/pages/register/register_binding.dart';
import 'package:psi/pages/register/register_view.dart';

import '../pages/home/purchase/purchase_add/purchase_add_view.dart';
import '../pages/splash/splash_binding.dart';
import '../pages/splash/splash_view.dart';


part 'app_routes.dart';

abstract class AppPages {
  /// 获取界面
  static GetPage createPage(String name, GetPageBuilder page,
      {bool? popGesture, Bindings? binding, List<Bindings> bindings = const [], List<GetMiddleware>? middlewares, Transition? transition, Duration? transitionDuration}) {
    return GetPage(
      name: name,
      page: page,
      popGesture: popGesture ?? Get.isPopGestureEnable,
      binding: binding,
      bindings: bindings,
      transition: transition ?? Transition.cupertino,
      transitionDuration: transitionDuration,
      middlewares: middlewares ?? [RouteMiddleware()],
    );
  }

  static final List<GetPage> pages = [
    createPage(PageNames.splash, () => SplashPage(), binding: SplashBinding(), transition: Transition.zoom),
    createPage(PageNames.home, () => HomePage(), binding: HomeBinding()),
    createPage(PageNames.login, () => LoginPage(), binding: LoginBinding()),
    createPage(PageNames.register, () => RegisterPage(), binding: RegisterBinding()),
    createPage(PageNames.purchaseAdd, () => PurchaseAddPage(), binding: PurchaseAddBinding()),
    createPage(PageNames.changePassword, () => ChangePasswordPage(), binding: ChangePasswordBinding()),
    createPage(PageNames.salesAdd, () => SalesAddPage(), binding: SalesAddBinding()),

  ];
}

/// 路由中间件
class RouteMiddleware extends GetMiddleware {
  /// 当被调用路由的页面被搜索时，这个函数将被调用。它将RouteSettings作为重定向的结果。或者给它null，就没有重定向了。
  @override
  RouteSettings? redirect(String? route) {
    // Utils.logI('route: $route');
    return super.redirect(route);
  }

  /// 这个函数将在处理完页面的所有相关对象(Controllers, views, ...)之后被调用
  @override
  void onPageDispose() {
    super.onPageDispose();
    // Utils.logI('onPageDispose');
  }

  /// 这个函数将在GetPage.page调用后被调用，并给出函数的结果，并获取将要显示的widget。
  @override
  Widget onPageBuilt(Widget page) {
    return super.onPageBuilt(page);
  }

  /// 这个函数将在绑定初始化之后被调用。 在这里，您可以在创建绑定之后和创建页面widget之前执行一些操作。
  @override
  GetPageBuilder? onPageBuildStart(GetPageBuilder? page) {
    return super.onPageBuildStart(page);
  }

  /// 这个函数将在绑定初始化之前被调用。 在这里，您可以更改此页面的绑定。
  @override
  List<Bindings>? onBindingsStart(List<Bindings>? bindings) {
    return super.onBindingsStart(bindings);
  }

  /// 在调用页面时，创建任何东西之前，这个函数会先被调用。 您可以使用它来更改页面的某些内容或给它一个新页面。
  @override
  GetPage? onPageCalled(GetPage? page) {
    return super.onPageCalled(page);
  }
}
